﻿/**
 * DeepCMS中，一个路由是一个HTTP方法与URL匹配范式的配对。每个路由都与一个代码块关联：

get '/' do
  .. 显示一些事物 ..
end

post '/' do
  .. 创建一些事物 ..
end

put '/' do
  .. 更新一些事物 ..
end

delete '/' do
  .. 消灭一些事物 ..
end

路由按照它们被定义的顺序进行匹配。第一个与请求匹配的路由会被调用。
 * oute根据请求的url等信息去获取获取controller和action的信息，
 * 如果获取到，则通过动态调用调用action方法，如果没有匹配的action信息，则作为静态文件处理。
 */
$$.Server = new (function(){
	if(!$$.event){
		throw '缺乏相应的模块！';
	}
	
	$$.event.apply(this, arguments);
	this.addEvents('request');			// 收到请求后触发的事件。
	this.addEvents('action');			// 业务逻辑完毕后触发的事件。
	
	/**
	 * 返回执行业务逻辑其名称，即执行哪个方法的名称。默认为 findPage 读取记录（分页的）。
	 * @return {String}
	 */
	this.dispatch = function(domainObj){
	    var req	= new $$.Server.request;
	    var reqObj;
	    var action;
	    
	    if(req.isRawPOST()){
	    	reqObj = req.isRawPOST();
	    }else if(req.isPOST()){
		    reqObj = req.formPost();
	    }else {
		    reqObj = req.queryString();
	    }
	    
	    action	= (reqObj.action || '').toUpperCase();
	    
	    action  = action || 'findPage'; // 默认读取记录（分页的）

		return action;
	}
	
	/**
	 * 打印结果。
	 */
	this.response = function(){
		Response.write(this.printOut || (function(){
			var err = '缺乏要输出的内容，请检查请求内容或者业务逻辑!';
			throw err;
			return err;
		})());
		Response.end();
	}
	
	/**
	 * 统一编码为UTF-8
	 */
	this.setUTF8 = function(){
		Response.Charset		= "utf-8";
		Session.CodePage		= 65001;
		Session.Timeout			= 200;
		Server.ScriptTimeout	= 100;		
	}
	
	/**
	 * 不缓存
	 */
	this.noCache = function(){
		with(Response){
			buffer = false;
			expires = -1;
			addHeader("Pragma","no-cache");
			addHeader("cache-ctrol","no-cache");
		}	
	}
	
	
	/**
	 * arr中的元素结构如下： { subDomain: '' ,subURL : '' }
	 */
	this.subRedirect = function(arr, isRedirect) {
		var url = Request.ServerVariables("HTTP_HOST")().toLowerCase();
		for (var i = 0; i < arr.length; i++) {
			if (arr[i].subDomain == url) {
				if (isRedirect) {
					Response.Redirect(arr[i].subURL);
				} else {
					Server.transfer(arr[i].subURL);
				}
				break;
			}
		}
	}
	
	/**
	 * 301 永久重定向。
	 * @param {String} url 要跳转的地址。
	 */
	this.urlForward = function (url){
		Response.Status = "301 Moved Permanently";
		Response.addHeader("Location",url);
		Response.End();
	}

	this.require = function(filePath){
		// for MS ASP Boost file
	    if(arguments.length > 1){
	        argsList(arguments, arguments.callee);
	    }else{
	        with (new ActiveXObject("Adodb.Stream")){
	            type = 2;
	            mode = 3;
	            charset = "utf-8";
	            open();
	            loadFromFile(Server.Mappath(filePath));
	            var source = readText();
	            eval(source);
	            close();
	        }
	    }
	}
	
	this.start = function(domainObj){
		this.setUTF8();
		
		// 登记服务器 request 事件。若有请求，绑定域对象，然后响应请求端。
		this.on('request', function(){

			this.dispatch(domainObj);
			this.response();
		});
		
		this.fireEvent('request', this);
	}
	
	this.log = function(log){
		var json, tmp;
		
		if(log.sql){
			tmp = log.sql;
			delete log.sql;
		}
		json = $$.XML.json2xml(log);
		
		var logItem = new ActiveXObject('Msxml2.DOMDocument.6.0');
		if(!logItem.loadXML('<item>' + json + '</item>')){
			throw "生成日志XML文档时错误";
		}
		var value = logItem.createElement("value");
		var cd = logItem.createCDATASection(tmp);
		
		value.appendChild(cd);
		logItem.firstChild.appendChild(value);
		// 插入新的XML节点
		var xml = new ActiveXObject('Msxml2.DOMDocument.6.0');
		if(!xml.load(Server.Mappath('/app/public/log.xml'))){
			throw "保存日志XML文档时错误";
		}
	
		xml.lastChild.appendChild(logItem.firstChild);
	
		$$.XML.saveXML(xml);
		
		logItem = xml = value = cd = null;
		
		return true;
	}
});

